#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2022/11/8 17:00
# @Author  : 招财大龙猫
# @File    : cprofile_test.py
# @Description : cProfile 性能分析代码
# import cProfile

"""
 python -m cProfile  .\cprofile_test.py  分析程序执行的性能
 或者
 import cProfile
 cProfile.run('fib_seq(30)')
 
ncalls，是指相应代码 / 函数被调用的次数；
tottime，是指对应代码 / 函数总共执行所需要的时间（注意，并不包括它调用的其他代
码 / 函数的执行时间）；
tottime percall，就是上述两者相除的结果，也就是tottime / ncalls；
cumtime，则是指对应代码 / 函数总共执行所需要的时间，这里包括了它调用的其他代
码 / 函数的执行时间；
cumtime percall，则是 cumtime 和 ncalls 相除的平均结果。
"""


def memoize(f):
    memo = {}

    def helper(x):
        if x not in memo:
            memo[x] = f(x)
        return memo[x]

    return helper


@memoize
def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)


def fib_seq(n):
    res = []
    if n > 0:
        res.extend(fib_seq(n - 1))
        res.append(fib(n))
    return res


if __name__ == '__main__':
    fib_seq(30)
